]> dgit.raspbian.org Git - puma.git/commitdiff
Import puma_5.6.5-3+deb12u2.debian.tar.xz
authorAbhijith PA <abhijith@debian.org>
Mon, 5 Oct 2026 04:40:12 +0000 (10:10 +0530)
committerAbhijith PA <abhijith@debian.org>
Mon, 5 Oct 2026 04:40:12 +0000 (10:10 +0530)
[dgit import tarball puma 5.6.5-3+deb12u2 puma_5.6.5-3+deb12u2.debian.tar.xz]

31 files changed:
README.source [new file with mode: 0644]
changelog [new file with mode: 0644]
clean [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
gbp.conf [new file with mode: 0644]
patches/0004-puma.gemspec-drop-git-usage.patch [new file with mode: 0644]
patches/0011-disable-minitest-extensions.patch [new file with mode: 0644]
patches/0012-disable-cli-ssl-tests.patch [new file with mode: 0644]
patches/0013-fix-test-term-not-accepts-new-connections.patch [new file with mode: 0644]
patches/0014-disable-test-failing-on-amd64.patch [new file with mode: 0644]
patches/CVE-2023-40175.patch [new file with mode: 0644]
patches/CVE-2024-21647.patch [new file with mode: 0644]
patches/CVE-2024-45614.patch [new file with mode: 0644]
patches/CVE-2026-47736_37.patch [new file with mode: 0644]
patches/new-certs-generated.patch [new file with mode: 0644]
patches/series [new file with mode: 0644]
puma.1 [new file with mode: 0644]
puma.docs [new file with mode: 0644]
puma.examples [new file with mode: 0644]
puma.lintian-overrides [new file with mode: 0644]
puma.manpages [new file with mode: 0644]
pumactl.1 [new file with mode: 0644]
ruby-tests.rake [new file with mode: 0644]
rules [new file with mode: 0755]
salsa-ci.yml [new file with mode: 0644]
source/format [new file with mode: 0644]
source/lintian-overrides [new file with mode: 0644]
tests/control [new file with mode: 0644]
upstream/metadata [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/README.source b/README.source
new file mode 100644 (file)
index 0000000..620cda3
--- /dev/null
@@ -0,0 +1,14 @@
+puma (4.3.1-1)
+
+  Several tests have been disabled by default:
+
+  - test/test_puma_server_ssl.rb has been disabled because all tests fail
+    randomly. However these tests have never been performed in puma 3.x and
+    they also work randomly. So until someone can look into them and fix them,
+    we decided to not run them (see also #921931).
+
+  - test_control_for_ssl (test/test_cli.rb) and
+    test_control_ssl (test/test_pumactl.rb) show similar issues and don't seem
+    to imply that the package fails to work. So they have been disabled too.
+
+ -- Daniel Leidert <dleidert@debian.org>  Wed, 05 Feb 2020 23:51:51 +0100
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..b0ff7f6
--- /dev/null
+++ b/changelog
@@ -0,0 +1,308 @@
+puma (5.6.5-3+deb12u2) bookworm-security; urgency=high
+
+  * Non-maintainer upload by the Debian LTS Team.
+  * Fix CVE-2026-47736, CVE-2026-47737.
+  * Refresh ssl certs for the tests
+
+ -- Abhijith PA <abhijith@debian.org>  Mon, 05 Oct 2026 10:10:12 +0530
+
+puma (5.6.5-3+deb12u1) bookworm; urgency=medium
+
+  * Team upload
+  * d/patches/
+   + CVE-2023-40175.patch: Fix CVE-2023-40175, incorrect behavior when
+     parsing chunked transfer encoding bodies and zero-length
+     Content-Length headers in a way that allowed HTTP request
+     smuggling. (Closes: #1050079)
+
+   + CVE-2024-21647.patch: Fix CVE-2024-21647 by limiting the size of
+     chunk extensions. (Closes: #1060345)
+
+   + CVE-2024-45614.patch: Fix CVE-2024-45614, clients could clobber
+     values set by intermediate proxies (such as X-Forwarded-For) by
+     providing a underscore version of the same header.
+     (Closes: #1082379)
+
+ -- Abhijith PA <abhijith@debian.org>  Wed, 29 Jan 2025 07:26:33 +0530
+
+puma (5.6.5-3) unstable; urgency=medium
+
+  * Team upload.
+  * d/control (Vcs-Git): Fix URL.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 09 Feb 2023 16:24:05 +0100
+
+puma (5.6.5-2) unstable; urgency=medium
+
+  * debian/ruby-tests.rake: skip test that fails often (Closes: #1006022)
+  * debian/ruby-tests.rake: exclude tests that fail often but not always
+
+ -- Antonio Terceiro <terceiro@debian.org>  Wed, 02 Nov 2022 09:26:37 -0300
+
+puma (5.6.5-1) unstable; urgency=medium
+
+  * Update watch file for github.com pattern change
+  * New upstream version 5.6.5
+  * Refresh patches
+  * Bump Standards-Version to 4.6.1 (no changes needed)
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 16 Oct 2022 22:44:46 +0530
+
+puma (5.6.4-1) unstable; urgency=medium
+
+  * New upstream version 5.6.4
+  * Refresh patches
+  * Disable some tests that fail with 
+     NameError: uninitialized constant Puma::LogWriter
+  * Remove tmp/restart.txt in clean
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 04 Apr 2022 13:24:10 +0530
+
+puma (5.5.2-2) unstable; urgency=medium
+
+  * Team upload
+  * debian/rules: force an UTF-8 locale
+  * debian/ruby-tests.rake: wrap lines
+  * debian/ruby-tests.rake: run all ssl tests on autopkgtest only
+  * debian/test/control: give ssl test a name
+
+ -- Antonio Terceiro <terceiro@debian.org>  Tue, 02 Nov 2021 16:35:12 -0300
+
+puma (5.5.2-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream version 5.5.2
+    - Builds and tests fine again (Closes: #998295)
+  * Add build-dependency on ruby-localhost
+  * debian/rules: exclude several unnecessary files from installation
+
+ -- Antonio Terceiro <terceiro@debian.org>  Tue, 02 Nov 2021 14:39:10 -0300
+
+puma (5.3.2-3) unstable; urgency=medium
+
+  * Use --gem-install layout option of dh-ruby
+
+ -- Pirate Praveen <praveen@debian.org>  Tue, 12 Oct 2021 02:24:33 +0530
+
+puma (5.3.2-2) unstable; urgency=medium
+
+  * Reupload to unstable
+  * Bump Standards-Version to 4.6.0 (no changes needed)
+  * Bump debhelper compatibility level to 13
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 11 Oct 2021 03:17:23 +0530
+
+puma (5.3.2-1) experimental; urgency=medium
+
+  * New upstream version 5.3.2 (Closes: #989054) (Fixes: CVE-2021-29509)
+  * Refresh patches
+
+ -- Pirate Praveen <praveen@debian.org>  Fri, 28 May 2021 22:34:53 +0530
+
+puma (4.3.8-1) unstable; urgency=medium
+
+  * New upstream version 4.3.8 (Closes: #989054) (Fixes: CVE-2021-29509)
+
+ -- Pirate Praveen <praveen@debian.org>  Wed, 26 May 2021 10:24:19 +0530
+
+puma (5.2.2-2) experimental; urgency=medium
+
+  * Disable test that failied on amd64 buildd
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 08 Mar 2021 23:03:52 +0530
+
+puma (5.2.2-1) experimental; urgency=medium
+
+  * New upstream version 5.2.2
+  * Bump Standards-Version to 4.5.1 (no changes needed)
+  * Refresh patches for new upstream release
+  * Add ruby-minitest-stub-const as build dependency
+  * Disable failing tests
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 07 Mar 2021 21:03:52 +0530
+
+puma (4.3.6-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream version.
+    - Fixes CVE-2020-11076 and CVE-2020-11077 (closes: #972102).
+  * d/copyright: Minor update.
+  * d/puma.lintian-overrides: Add package override.
+  * d/ruby-tests.rake: Add logic to run SSL test.
+  * d/patches/*.patch: Add missing headers and refresh.
+  * d/source/lintian-overrides: Add source override.
+  * d/tests/control: Set environment variable to run the SSL tests separately
+    (similar to the solution used in the jekyll package).
+  * d/tests/test-puma-server-ssl*: Removed.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 15 Oct 2020 20:57:29 +0200
+
+puma (4.3.3-3) unstable; urgency=medium
+
+  * Include patch from gitlab to improve performance
+
+ -- Pirate Praveen <praveen@debian.org>  Tue, 18 Aug 2020 00:15:20 +0530
+
+puma (4.3.3-2) unstable; urgency=medium
+
+  [ Daniel Leidert ]
+  * debian/tests/test_puma_server_ssl,
+    debian/tests/test_puma_server_ssl.rake: Run test/test_puma_server_ssl.rb
+    in an openssl enviroment not using the Debian defaults.
+  * debian/tests/control: Add new test.
+
+  [ Debian Janitor ]
+  * Set field Upstream-Contact in debian/copyright.
+  * Remove obsolete fields Contact, Name from debian/upstream/metadata
+    (already present in machine-readable debian/copyright).
+
+  [ Pirate Praveen ]
+  * Remove debian-branch option from debian/gbp.conf
+  * Reupload to unstable
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 03 Aug 2020 15:37:16 +0530
+
+puma (4.3.3-1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+    - Fixes CVE-2020-5247 (closes: #952766).
+    - Fixes CVE-2020-5249 (closes: #953122).
+  * d/control (Section): Change to web.
+    (Vcs-Git): Indicate branch name via -b debian/experimental.
+    (Homepage): Use secure URL.
+    (Depends): Use ${ruby:Depends}.
+  * d/copyright (Source): Use secure URL.
+  * d/rules: Add override to install upstream changelog.
+  * d/watch: Use package name for tarball.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 05 Mar 2020 01:34:17 +0100
+
+puma (4.3.1-1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release
+    - Fixes CVE-2019-16770 Keepalive thread overload/DoS (closes: #946312).
+  * d/control (Rules-Requires-Root): Set to binary-targets.
+    (Build-Depends, Depends): Add ruby-nio4r.
+    (Build-Depends): Add curl for test/test_integration_single.rb.
+  * d/ruby-tests.rake: Disable test/test_puma_server_ssl.rb.
+  * d/README.source: Add to explain tests which have been disabled.
+  * d/patches/0004-puma.gemspec-drop-git-usage.patch: Refresh patch.
+  * d/patches/0011-disable-minitest-extensions.patch: Add patch.
+    - Disable unavailable minitest extensions (retry and proveit).
+  * d/patches/0012-disable-cli-ssl-tests.patch: Add patch.
+    - Disable CLI SSL tests.
+  * d/patches/0013-fix-test-term-not-accepts-new-connections.patch: Add.
+    - Fix test_term_not_accepts_new_connections to be locale independent.
+  * d/patches/0002-test_integration-disable-test-that-fails-randomly.patch,
+    d/patches/0003-test_cli-disable-test-that-rails-randomly.patch,
+    d/patches/0005-test_puma_server-disable-test-that-fails-randomly.patch,
+    d/patches/0006-test-helper.rb-drop-bundler-usage.patch,
+    d/patches/0007-test-test_cli.rb-disable-test-that-fails-randomly.patch,
+    d/patches/0008-fix-ssl-tests.patch,
+    d/patches/0009-disable-tests-failing-in-single-cpu.patch,
+    d/patches/0010-fix-cluster-exit-for-ruby27.patch: Remove obsolete patches.
+  * d/patches/series: Adjust.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 06 Feb 2020 11:45:11 +0100
+
+puma (3.12.4-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+    - Fixes CVE-2020-5247 (closes: #952766).
+    - Fixes CVE-2020-5249 (closes: #953122).
+  * d/control (Section): Changed to web.
+    (Homepage): Use secure URL.
+    (Depends): Add ${ruby:Depends}.
+  * d/copyright (Source): Use secure URL.
+  * d/ruby-tests.rake: Disable test/test_puma_server_ssl.rb for the moment.
+    These tests fail due to openssl being configured to use SECLEVEL2
+    (https://github.com/puma/puma/issues/2147).
+  * d/rules: Add override to install upstream changelog.
+  * d/watch: Rename downloaded tarball to include package name.
+  * d/patches/0008-fix-ssl-tests.patch: Remove patch. Applied upstream.
+  * d/patches/CVE-2019-16770.patch: Ditto.
+  * d/patches/*.patch: Refresh patches.
+  * d/patches/series: Adjust.
+
+ -- Daniel Leidert <dleidert@debian.org>  Wed, 04 Mar 2020 23:09:16 +0100
+
+puma (3.12.0-4) unstable; urgency=medium
+
+  * Team upload.
+  * d/control (Rules-Requires-Root): Set to binary-targets.
+  * d/patches/0011-disable-minitest-extensions.patch: Add patch.
+    - Disable unavailable minitest retry extension.
+  * d/patches/CVE-2019-16770.patch: Add patch.
+    - Backport fix for CVE-2019-16770 from upstream (closes: #946312).
+  * d/patches/series: Add patch.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 06 Feb 2020 12:54:59 +0100
+
+puma (3.12.0-3) unstable; urgency=medium
+
+  * Team upload.
+  * d/compat: Remove obsolete file.
+  * d/control: Add Rules-Requires-Root field.
+    (Build-Depends): Use debhelper-compat.
+    (Standards-Version): Bump to 4.5.0.
+    (Depends): Drop ruby-interpreter.
+  * d/copyright (Format): Fix insecure-copyright-format-uri and add myself.
+  * d/puma.1, d/pumactl.1: Add manual pages.
+  * d/puma.manpages: Install manual pages.
+  * d/ruby-tests.rake: Set verbose mode.
+  * d/patches/0010-fix-cluster-exit-for-ruby27.patch: Add patch.
+    - Fix hang with Ruby >= 2.6 when shutting down workers.
+  * d/patches/series: Enable new patch.
+  * d/upstream/metadata: Add metadata.
+  * d/upstream/metadata: Add metadata.
+
+ -- Daniel Leidert <dleidert@debian.org>  Wed, 05 Feb 2020 18:20:58 +0100
+
+puma (3.12.0-2) unstable; urgency=medium
+
+  * Disable tests failing in single cpu (Closes: #921931)
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 10 Feb 2019 18:56:47 +0530
+
+puma (3.12.0-1) unstable; urgency=medium
+
+  [ Balint Reczey ]
+  * New upstream version 3.12.0
+  * Refresh patches
+
+  [ Pirate Praveen ]
+  * Fix OpenSSL 1.1.1 test failures with upstream patch (Closes: #900156)
+  * Bump Standards-Version to 4.3.0 (no changes needed)
+  * Add myself to uploaders
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 10 Feb 2019 10:56:59 +0530
+
+puma (3.11.3-1) unstable; urgency=medium
+
+  * Team upload
+  * Remove myself from Uploaders:
+  * New upstream version 3.11.3
+  * Build against libssl-dev instead of libssl1.0-dev (Closes: #859542)
+  * Refresh packaging files with `dh-make-ruby -wo .`
+    * Bump debhelper compat to 11
+    * Change Vcs-* to point to salsa.debian.org
+    * Use standard debian/ruby-tests.rake
+      * drop build-dependency on ruby-hoe
+  * Refresh patches
+  * New patches:
+    - 0006-test-helper.rb-drop-bundler-usage.patch
+    - 0007-test-test_cli.rb-disable-test-that-fails-randomly.patch
+  * Replace 0001-test_puma_server_ssl-update-for-newer-versions-of-Op.patch
+    with 0001-test_puma_server_ssl-disable-test-that-takes-too-lon.patch
+
+
+ -- Antonio Terceiro <terceiro@debian.org>  Wed, 28 Mar 2018 18:53:22 -0300
+
+puma (3.6.0-1) unstable; urgency=medium
+
+  * Initial release (Closes: #720336)
+
+ -- Antonio Terceiro <terceiro@debian.org>  Thu, 10 Nov 2016 16:47:06 -0200
diff --git a/clean b/clean
new file mode 100644 (file)
index 0000000..4535125
--- /dev/null
+++ b/clean
@@ -0,0 +1 @@
+tmp/restart.txt
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..84a0183
--- /dev/null
+++ b/control
@@ -0,0 +1,30 @@
+Source: puma
+Section: web
+Priority: optional
+Maintainer: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
+Uploaders: Pirate Praveen <praveen@debian.org>
+Build-Depends: curl,
+               debhelper-compat (= 13),
+               gem2deb (>= 1.6),
+               libssl-dev,
+               rake,
+               ruby-localhost,
+               ruby-nio4r (>= 2),
+               ruby-rack (<< 3),
+               ruby-minitest-stub-const
+Standards-Version: 4.6.1
+Vcs-Git: https://salsa.debian.org/ruby-team/puma.git
+Vcs-Browser: https://salsa.debian.org/ruby-team/puma
+Homepage: https://puma.io
+Testsuite: autopkgtest-pkg-ruby
+XS-Ruby-Versions: all
+Rules-Requires-Root: binary-targets
+
+Package: puma
+Architecture: any
+XB-Ruby-Versions: ${ruby:Versions}
+Depends: ruby, ${misc:Depends}, ${ruby:Depends}, ${shlibs:Depends}
+Description: threaded HTTP 1.1 server for Ruby/Rack applications
+ Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
+ Ruby/Rack applications. Puma is intended for use in both development and
+ production environments.
diff --git a/copyright b/copyright
new file mode 100644 (file)
index 0000000..32ce732
--- /dev/null
+++ b/copyright
@@ -0,0 +1,41 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: puma
+Upstream-Contact: https://github.com/puma/puma/issues
+Source: https://github.com/puma/puma
+
+Files: *
+Copyright: 2005, Zed Shaw
+           2011, Evan Phoenix
+License: BSD-3-clause
+
+Files: debian/*
+Copyright: 2016 Antonio Terceiro <terceiro@debian.org>
+           2020 Daniel Leidert <dleidert@debian.org>
+License: BSD-3-clause
+Comment: The Debian packaging is licensed under the same terms as the source.
+
+License: BSD-3-clause
+ All rights reserved.
+ .
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ .
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of the Evan Phoenix nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/gbp.conf b/gbp.conf
new file mode 100644 (file)
index 0000000..51fd1ac
--- /dev/null
+++ b/gbp.conf
@@ -0,0 +1,3 @@
+[DEFAULT]
+pristine-tar = true
+verbose = true
diff --git a/patches/0004-puma.gemspec-drop-git-usage.patch b/patches/0004-puma.gemspec-drop-git-usage.patch
new file mode 100644 (file)
index 0000000..d5f0d7c
--- /dev/null
@@ -0,0 +1,21 @@
+From: Antonio Terceiro <terceiro@softwarelivre.org>
+Date: Wed, 5 Feb 2020 21:36:05 +0100
+Subject: Drop git usage from gemspec
+
+Forwarded: not-needed
+---
+ puma.gemspec | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/puma.gemspec
++++ b/puma.gemspec
+@@ -13,8 +13,7 @@
+   if RbConfig::CONFIG['ruby_version'] >= '2.5'
+     s.metadata["msys2_mingw_dependencies"] = "openssl"
+   end
+-  s.files = `git ls-files -- bin docs ext lib tools`.split("\n") +
+-            %w[History.md LICENSE README.md]
++  s.files = Dir.glob('**/*').reject { |f| f =~ /^debian\//}
+   s.homepage = "https://puma.io"
+ 
+   if s.respond_to?(:metadata=)
diff --git a/patches/0011-disable-minitest-extensions.patch b/patches/0011-disable-minitest-extensions.patch
new file mode 100644 (file)
index 0000000..6548af7
--- /dev/null
@@ -0,0 +1,39 @@
+From: Daniel Leidert <daniel.leidert@wgdd.de>
+Date: Wed, 5 Feb 2020 22:20:42 +0100
+Subject: Disable unavailable minitest extensions
+
+Forwarded: not-needed
+---
+ test/helper.rb | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/test/helper.rb
++++ b/test/helper.rb
+@@ -14,7 +14,6 @@
+ require_relative "minitest/verbose"
+ require "minitest/autorun"
+ require "minitest/pride"
+-require "minitest/proveit"
+ require "minitest/stub_const"
+ require "net/http"
+ require_relative "helpers/apps"
+@@ -102,10 +101,6 @@
+ end
+ 
+ Minitest::Test.prepend TimeoutEveryTestCase
+-if ENV['CI']
+-  require 'minitest/retry'
+-  Minitest::Retry.use!
+-end
+ 
+ module TestSkips
+ 
+@@ -178,7 +173,7 @@
+   REPO_NAME = ENV['GITHUB_REPOSITORY'] ? ENV['GITHUB_REPOSITORY'][/[^\/]+\z/] : 'puma'
+ 
+   def self.run(reporter, options = {}) # :nodoc:
+-    prove_it!
++    #prove_it!
+     super
+   end
+ 
diff --git a/patches/0012-disable-cli-ssl-tests.patch b/patches/0012-disable-cli-ssl-tests.patch
new file mode 100644 (file)
index 0000000..1be1cd9
--- /dev/null
@@ -0,0 +1,21 @@
+From: Daniel Leidert <daniel.leidert@wgdd.de>
+Date: Wed, 5 Feb 2020 23:18:37 +0100
+Subject: Disable cli ssl tests
+
+Forwarded: not-needed
+---
+ test/test_cli.rb     | 2 +-
+ test/test_pumactl.rb | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/test/test_pumactl.rb
++++ b/test/test_pumactl.rb
+@@ -223,7 +223,7 @@
+     refute_includes log, 'send_request'
+   end
+ 
+-  def test_control_ssl
++  def __test_control_ssl
+     skip_unless :ssl
+ 
+     host = "127.0.0.1"
diff --git a/patches/0013-fix-test-term-not-accepts-new-connections.patch b/patches/0013-fix-test-term-not-accepts-new-connections.patch
new file mode 100644 (file)
index 0000000..9dae6b6
--- /dev/null
@@ -0,0 +1,20 @@
+From: Daniel Leidert <daniel.leidert@wgdd.de>
+Date: Thu, 6 Feb 2020 11:24:24 +0100
+Subject: Fix test to read output locale independent
+
+The test fails if run in a non-English environment.
+---
+ test/test_integration_single.rb | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/test/test_integration_single.rb
++++ b/test/test_integration_single.rb
+@@ -76,7 +76,7 @@
+     true while @server.gets !~ /Gracefully stopping/ # wait for server to begin graceful shutdown
+ 
+     # Invoke a request which must be rejected
+-    _stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3("curl #{HOST}:#{@tcp_port}")
++    _stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3({ "LC_ALL" => "C" }, "curl http://#{HOST}:#{@tcp_port}")
+ 
+     assert nil != Process.getpgid(@server.pid) # ensure server is still running
+     assert nil != Process.getpgid(curl_wait_thread[:pid]) # ensure first curl invocation still in progress
diff --git a/patches/0014-disable-test-failing-on-amd64.patch b/patches/0014-disable-test-failing-on-amd64.patch
new file mode 100644 (file)
index 0000000..196e878
--- /dev/null
@@ -0,0 +1,14 @@
+This test failed on amd64 buildd
+https://buildd.debian.org/status/fetch.php?pkg=puma&arch=amd64&ver=5.2.2-1&stamp=1615133735&raw=0
+
+--- a/test/test_puma_server.rb
++++ b/test/test_puma_server.rb
+@@ -1294,7 +1294,7 @@
+     end
+   end
+ 
+-  def test_command_ignored_before_run
++  def __test_command_ignored_before_run
+     @server.stop # ignored
+     @server.run
+     @server.halt
diff --git a/patches/CVE-2023-40175.patch b/patches/CVE-2023-40175.patch
new file mode 100644 (file)
index 0000000..be9cff8
--- /dev/null
@@ -0,0 +1,143 @@
+From 7405a219801dcebc0ad6e0aa108d4319ca23f662 Mon Sep 17 00:00:00 2001
+From: Nate Berkopec <nate.berkopec@gmail.com>
+Date: Fri, 18 Aug 2023 09:47:23 +0900
+Subject: [PATCH] Merge pull request from GHSA-68xg-gqqm-vgj8
+
+* Reject empty string for Content-Length
+
+* Ignore trailers in last chunk
+
+* test_puma_server.rb - use heredoc, test_cl_and_te_smuggle
+
+* client.rb - stye/RubyCop
+
+* test_puma_server.rb - indented heredoc rubocop disable
+
+* Dentarg comments
+
+* Remove unused variable
+
+---------
+
+Co-authored-by: MSP-Greg <Greg.mpls@gmail.com>
+---
+ lib/puma/client.rb       | 23 ++++++++++++++--------
+ test/test_puma_server.rb | 42 +++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 56 insertions(+), 9 deletions(-)
+
+diff --git a/lib/puma/client.rb b/lib/puma/client.rb
+index e966f995e8..9c11912caa 100644
+--- a/lib/puma/client.rb
++++ b/lib/puma/client.rb
+@@ -45,7 +45,8 @@ class Client
+ 
+     # chunked body validation
+     CHUNK_SIZE_INVALID = /[^\h]/.freeze
+-    CHUNK_VALID_ENDING = "\r\n".freeze
++    CHUNK_VALID_ENDING = Const::LINE_END
++    CHUNK_VALID_ENDING_SIZE = CHUNK_VALID_ENDING.bytesize
+ 
+     # Content-Length header value validation
+     CONTENT_LENGTH_VALUE_INVALID = /[^\d]/.freeze
+@@ -347,8 +348,8 @@ def setup_body
+       cl = @env[CONTENT_LENGTH]
+ 
+       if cl
+-        # cannot contain characters that are not \d
+-        if cl =~ CONTENT_LENGTH_VALUE_INVALID
++        # cannot contain characters that are not \d, or be empty
++        if cl =~ CONTENT_LENGTH_VALUE_INVALID || cl.empty?
+           raise HttpParserError, "Invalid Content-Length: #{cl.inspect}"
+         end
+       else
+@@ -509,7 +510,7 @@ def decode_chunk(chunk)
+ 
+       while !io.eof?
+         line = io.gets
+-        if line.end_with?("\r\n")
++        if line.end_with?(CHUNK_VALID_ENDING)
+           # Puma doesn't process chunk extensions, but should parse if they're
+           # present, which is the reason for the semicolon regex
+           chunk_hex = line.strip[/\A[^;]+/]
+@@ -521,13 +522,19 @@ def decode_chunk(chunk)
+             @in_last_chunk = true
+             @body.rewind
+             rest = io.read
+-            last_crlf_size = "\r\n".bytesize
+-            if rest.bytesize < last_crlf_size
++            if rest.bytesize < CHUNK_VALID_ENDING_SIZE
+               @buffer = nil
+-              @partial_part_left = last_crlf_size - rest.bytesize
++              @partial_part_left = CHUNK_VALID_ENDING_SIZE - rest.bytesize
+               return false
+             else
+-              @buffer = rest[last_crlf_size..-1]
++              # if the next character is a CRLF, set buffer to everything after that CRLF
++              start_of_rest = if rest.start_with?(CHUNK_VALID_ENDING)
++                CHUNK_VALID_ENDING_SIZE
++              else # we have started a trailer section, which we do not support. skip it!
++                rest.index(CHUNK_VALID_ENDING*2) + CHUNK_VALID_ENDING_SIZE*2
++              end
++
++              @buffer = rest[start_of_rest..-1]
+               @buffer = nil if @buffer.empty?
+               set_ready
+               return true
+diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb
+index 298e44b439..2bfaf98848 100644
+--- a/test/test_puma_server.rb
++++ b/test/test_puma_server.rb
+@@ -627,7 +627,7 @@ def test_large_chunked_request
+       [200, {}, [""]]
+     }
+ 
+-    header = "GET / HTTP/1.1\r\nConnection: close\r\nTransfer-Encoding: chunked\r\n\r\n"
++    header = "GET / HTTP/1.1\r\nConnection: close\r\nContent-Length: 200\r\nTransfer-Encoding: chunked\r\n\r\n"
+ 
+     chunk_header_size = 6 # 4fb8\r\n
+     # Current implementation reads one chunk of CHUNK_SIZE, then more chunks of size 4096.
+@@ -1365,4 +1365,44 @@ def test_rack_url_scheme_user
+     data = send_http_and_read "GET / HTTP/1.0\r\n\r\n"
+     assert_equal "user", data.split("\r\n").last
+   end
++
++  def test_cl_empty_string
++    server_run do |env|
++      [200, {}, [""]]
++    end
++
++    empty_cl_request = "GET / HTTP/1.1\r\nHost: localhost\r\nContent-Length:\r\n\r\nGET / HTTP/1.1\r\nHost: localhost\r\n\r\n"
++
++    data = send_http_and_read empty_cl_request
++    assert_operator data, :start_with?, 'HTTP/1.1 400 Bad Request'
++  end
++
++  def test_crlf_trailer_smuggle
++    server_run do |env|
++      [200, {}, [""]]
++    end
++
++    smuggled_payload = "GET / HTTP/1.1\r\nTransfer-Encoding: chunked\r\nHost: whatever\r\n\r\n0\r\nX:POST / HTTP/1.1\r\nHost: whatever\r\n\r\nGET / HTTP/1.1\r\nHost: whatever\r\n\r\n"
++
++    data = send_http_and_read smuggled_payload
++    assert_equal 2, data.scan("HTTP/1.1 200 OK").size
++  end
++
++  # test to check if content-length is ignored when 'transfer-encoding: chunked'
++  # is used.  See also test_large_chunked_request
++  def test_cl_and_te_smuggle
++    body = nil
++    server_run { |env|
++      body = env['rack.input'].read
++      [200, {}, [""]]
++    }
++
++    req = "POST /search HTTP/1.1\r\nHost: vulnerable-website.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\nTransfer-Encoding: chunked\r\n\r\n7b\r\nGET /404 HTTP/1.1\r\nHost: vulnerable-website.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 144\r\n\r\nx=\r\n0\r\n\r\n"
++
++    data = send_http_and_read req
++
++    assert_includes body, "GET /404 HTTP/1.1\r\n"
++    assert_includes body, "Content-Length: 144\r\n"
++    assert_equal 1, data.scan("HTTP/1.1 200 OK").size
++  end
+ end
diff --git a/patches/CVE-2024-21647.patch b/patches/CVE-2024-21647.patch
new file mode 100644 (file)
index 0000000..47e523e
--- /dev/null
@@ -0,0 +1,93 @@
+From bbb880ffb6debbfdea535b4b3eb2204d49ae151d Mon Sep 17 00:00:00 2001
+From: Nate Berkopec <nate.berkopec@gmail.com>
+Date: Mon, 8 Jan 2024 14:48:43 +0900
+Subject: [PATCH] Merge pull request from GHSA-c2f4-cvqm-65w2
+
+Co-authored-by: MSP-Greg <MSP-Greg@users.noreply.github.com>
+Co-authored-by: Patrik Ragnarsson <patrik@starkast.net>
+Co-authored-by: Evan Phoenix <evan@phx.io>
+---
+ lib/puma/client.rb       | 27 +++++++++++++++++++++++++++
+ test/test_puma_server.rb | 14 ++++++++++++++
+ 2 files changed, 41 insertions(+)
+
+--- a/lib/puma/client.rb
++++ b/lib/puma/client.rb
+@@ -48,6 +48,14 @@ module Puma
+     CHUNK_VALID_ENDING = Const::LINE_END
+     CHUNK_VALID_ENDING_SIZE = CHUNK_VALID_ENDING.bytesize
+ 
++    # The maximum number of bytes we'll buffer looking for a valid
++    # chunk header.
++    MAX_CHUNK_HEADER_SIZE = 4096
++
++    # The maximum amount of excess data the client sends
++    # using chunk size extensions before we abort the connection.
++    MAX_CHUNK_EXCESS = 16 * 1024
++
+     # Content-Length header value validation
+     CONTENT_LENGTH_VALUE_INVALID = /[^\d]/.freeze
+ 
+@@ -460,6 +468,7 @@ module Puma
+       @chunked_body = true
+       @partial_part_left = 0
+       @prev_chunk = ""
++      @excess_cr = 0
+ 
+       @body = Tempfile.new(Const::PUMA_TMP_BASE)
+       @body.unlink
+@@ -541,6 +550,20 @@ module Puma
+             end
+           end
+ 
++          # Track the excess as a function of the size of the
++          # header vs the size of the actual data. Excess can
++          # go negative (and is expected to) when the body is
++          # significant.
++          # The additional of chunk_hex.size and 2 compensates
++          # for a client sending 1 byte in a chunked body over
++          # a long period of time, making sure that that client
++          # isn't accidentally eventually punished.
++          @excess_cr += (line.size - len - chunk_hex.size - 2)
++
++          if @excess_cr >= MAX_CHUNK_EXCESS
++            raise HttpParserError, "Maximum chunk excess detected"
++          end
++
+           len += 2
+ 
+           part = io.read(len)
+@@ -568,6 +591,10 @@ module Puma
+             @partial_part_left = len - part.size
+           end
+         else
++          if @prev_chunk.size + chunk.size >= MAX_CHUNK_HEADER_SIZE
++            raise HttpParserError, "maximum size of chunk header exceeded"
++          end
++
+           @prev_chunk = line
+           return false
+         end
+--- a/test/test_puma_server.rb
++++ b/test/test_puma_server.rb
+@@ -648,6 +648,20 @@ EOF
+     end
+   end
+ 
++  def test_large_chunked_request_header
++    server_run(environment: :production) { |env|
++      [200, {}, [""]]
++    }
++
++    max_chunk_header_size = Puma::Client::MAX_CHUNK_HEADER_SIZE
++    header = "GET / HTTP/1.1\r\nConnection: close\r\nContent-Length: 200\r\nTransfer-Encoding: chunked\r\n\r\n"
++    socket = send_http "#{header}1;t#{'x' * (max_chunk_header_size + 2)}"
++
++    data = socket.read
++
++    assert_match "HTTP/1.1 400 Bad Request\r\n\r\n", data
++  end
++
+   def test_chunked_request_pause_before_value
+     body = nil
+     content_length = nil
diff --git a/patches/CVE-2024-45614.patch b/patches/CVE-2024-45614.patch
new file mode 100644 (file)
index 0000000..b15eb82
--- /dev/null
@@ -0,0 +1,195 @@
+From cac3fd18cf29ed43719ff5d52d9cfec215f0a043 Mon Sep 17 00:00:00 2001
+From: Evan Phoenix <evan@phx.io>
+Date: Wed, 18 Sep 2024 21:56:07 -0700
+Subject: [PATCH] Merge commit from fork
+
+* Prevent underscores from clobbering hyphen headers
+
+* Special case encoding headers to prevent app confusion
+
+* Handle _ as , in jruby as well
+
+* Silence RuboCop offense
+
+---------
+
+Co-authored-by: Patrik Ragnarsson <patrik@starkast.net>
+---
+ ext/puma_http11/org/jruby/puma/Http11.java |  2 +
+ lib/puma/const.rb                          |  8 +++
+ lib/puma/request.rb                        | 19 ++++++--
+ test/test_normalize.rb                     | 57 ++++++++++++++++++++++
+ test/test_request_invalid.rb               | 28 +++++++++++
+ 5 files changed, 111 insertions(+), 3 deletions(-)
+ create mode 100644 test/test_normalize.rb
+
+--- a/ext/puma_http11/org/jruby/puma/Http11.java
++++ b/ext/puma_http11/org/jruby/puma/Http11.java
+@@ -99,6 +99,8 @@ public class Http11 extends RubyObject {
+             int bite = b.get(i) & 0xFF;
+             if(bite == '-') {
+                 b.set(i, (byte)'_');
++            } else if(bite == '_') {
++                b.set(i, (byte)',');
+             } else {
+                 b.set(i, (byte)Character.toUpperCase(bite));
+             }
+--- a/lib/puma/const.rb
++++ b/lib/puma/const.rb
+@@ -244,6 +244,14 @@ module Puma
+     # header values can contain HTAB?
+     ILLEGAL_HEADER_VALUE_REGEX = /[\x00-\x08\x0A-\x1F]/.freeze
+ 
++    # The keys of headers that should not be convert to underscore
++    # normalized versions. These headers are ignored at the request reading layer,
++    # but if we normalize them after reading, it's just confusing for the application.
++    UNMASKABLE_HEADERS = {
++      "HTTP_TRANSFER,ENCODING" => true,
++      "HTTP_CONTENT,LENGTH" => true,
++    }
++
+     # Banned keys of response header
+     BANNED_HEADER_KEY = /\A(rack\.|status\z)/.freeze
+ 
+--- a/lib/puma/request.rb
++++ b/lib/puma/request.rb
+@@ -318,6 +318,11 @@ module Puma
+     # compatibility, we'll convert them back. This code is written to
+     # avoid allocation in the common case (ie there are no headers
+     # with `,` in their names), that's why it has the extra conditionals.
++    #
++    # @note If a normalized version of a `,` header already exists, we ignore
++    #       the `,` version. This prevents clobbering headers managed by proxies
++    #       but not by clients (Like X-Forwarded-For).
++    #
+     # @param env [Hash] see Puma::Client#env, from request, modifies in place
+     # @version 5.0.3
+     #
+@@ -326,23 +331,30 @@ module Puma
+       to_add = nil
+ 
+       env.each do |k,v|
+-        if k.start_with?("HTTP_") and k.include?(",") and k != "HTTP_TRANSFER,ENCODING"
++        if k.start_with?("HTTP_") and k.include?(",") and !UNMASKABLE_HEADERS.key?(k)
+           if to_delete
+             to_delete << k
+           else
+             to_delete = [k]
+           end
+ 
++          new_k = k.tr(",", "_")
++          if env.key?(new_k)
++            next
++          end
++
+           unless to_add
+             to_add = {}
+           end
+ 
+-          to_add[k.tr(",", "_")] = v
++          to_add[new_k] = v
+         end
+       end
+ 
+       if to_delete
+         to_delete.each { |k| env.delete(k) }
++      end
++      if to_add
+         env.merge! to_add
+       end
+     end
+--- /dev/null
++++ b/test/test_normalize.rb
+@@ -0,0 +1,57 @@
++# frozen_string_literal: true
++
++require_relative "helper"
++
++require "puma/request"
++
++class TestNormalize < Minitest::Test
++  parallelize_me!
++
++  include Puma::Request
++
++  def test_comma_headers
++    env = {
++      "HTTP_X_FORWARDED_FOR" => "1.1.1.1",
++      "HTTP_X_FORWARDED,FOR" => "2.2.2.2",
++    }
++
++    req_env_post_parse env
++
++    expected = {
++      "HTTP_X_FORWARDED_FOR" => "1.1.1.1",
++    }
++
++    assert_equal expected, env
++
++    # Test that the iteration order doesn't matter
++
++    env = {
++      "HTTP_X_FORWARDED,FOR" => "2.2.2.2",
++      "HTTP_X_FORWARDED_FOR" => "1.1.1.1",
++    }
++
++    req_env_post_parse env
++
++    expected = {
++      "HTTP_X_FORWARDED_FOR" => "1.1.1.1",
++    }
++
++    assert_equal expected, env
++  end
++
++  def test_unmaskable_headers
++    env = {
++      "HTTP_CONTENT,LENGTH" => "100000",
++      "HTTP_TRANSFER,ENCODING" => "chunky"
++    }
++
++    req_env_post_parse env
++
++    expected = {
++      "HTTP_CONTENT,LENGTH" => "100000",
++      "HTTP_TRANSFER,ENCODING" => "chunky"
++    }
++
++    assert_equal expected, env
++  end
++end
+--- a/test/test_request_invalid.rb
++++ b/test/test_request_invalid.rb
+@@ -216,4 +216,32 @@ class TestRequestInvalid < Minitest::Tes
+ 
+     assert_status data
+   end
++
++  def test_underscore_header_1
++    hdrs = [
++      "X-FORWARDED-FOR: 1.1.1.1",  # proper
++      "X-FORWARDED-FOR: 2.2.2.2",  # proper
++      "X_FORWARDED-FOR: 3.3.3.3",  # invalid, contains underscore
++      "Content-Length: 5",
++    ].join "\r\n"
++
++    response = send_http_and_read "#{GET_PREFIX}#{hdrs}\r\n\r\nHello\r\n\r\n"
++
++    assert_includes response, "HTTP_X_FORWARDED_FOR = 1.1.1.1, 2.2.2.2"
++    refute_includes response, "3.3.3.3"
++  end
++
++  def test_underscore_header_2
++    hdrs = [
++      "X_FORWARDED-FOR: 3.3.3.3",  # invalid, contains underscore
++      "X-FORWARDED-FOR: 2.2.2.2",  # proper
++      "X-FORWARDED-FOR: 1.1.1.1",  # proper
++      "Content-Length: 5",
++    ].join "\r\n"
++
++    response = send_http_and_read "#{GET_PREFIX}#{hdrs}\r\n\r\nHello\r\n\r\n"
++
++    assert_includes response, "HTTP_X_FORWARDED_FOR = 2.2.2.2, 1.1.1.1"
++    refute_includes response, "3.3.3.3"
++  end
+ end
diff --git a/patches/CVE-2026-47736_37.patch b/patches/CVE-2026-47736_37.patch
new file mode 100644 (file)
index 0000000..b98ff9f
--- /dev/null
@@ -0,0 +1,165 @@
+From ebe9db3929ab8299d19c8f5b41e8ef4f4b22fa58 Mon Sep 17 00:00:00 2001
+From: Nate Berkopec <nate.berkopec@gmail.com>
+Date: Wed, 27 May 2026 08:33:21 +0900
+Subject: [PATCH] 7.2.1 backport (#3947)
+
+* Limit and anchor PROXY protocol parsing
+
+(cherry picked from commit f1f37d5822aa8ffe23e7d0d16e9a1f3b0eaf9bfd)
+
+* Parse PROXY protocol only once per connection
+
+(cherry picked from commit 8310c17cd43784723ed41a94d2a747da256306de)
+---
+ lib/puma/client.rb       | 38 ++++++++++++++-------
+ lib/puma/const.rb        |  3 +-
+ test/test_puma_server.rb | 71 ++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 100 insertions(+), 12 deletions(-)
+
+--- a/lib/puma/client.rb
++++ b/lib/puma/client.rb
+@@ -148,7 +148,7 @@ module Puma
+     def reset(fast_check=true)
+       @parser.reset
+       @read_header = true
+-      @read_proxy = !!@expect_proxy_proto
++      @read_proxy = !!@expect_proxy_proto && @requests_served.zero?
+       @env = @proto_env.dup
+       @body = nil
+       @tempfile = nil
+@@ -196,20 +196,36 @@ module Puma
+     def try_to_parse_proxy_protocol
+       if @read_proxy
+         if @expect_proxy_proto == :v1
+-          if @buffer.include? "\r\n"
+-            if md = PROXY_PROTOCOL_V1_REGEX.match(@buffer)
+-              if md[1]
+-                @peerip = md[1].split(" ")[0]
++          crlf_index = @buffer.index "\r\n"
++
++          unless crlf_index
++            if "PROXY ".start_with? @buffer
++              return false
++            elsif @buffer.start_with? "PROXY "
++              if @buffer.bytesize >= PROXY_PROTOCOL_V1_MAX_LENGTH
++                raise ConnectionError, "PROXY protocol v1 line is too long"
+               end
+-              @buffer = md.post_match
++              return false
+             end
+-            # if the buffer has a \r\n but doesn't have a PROXY protocol
+-            # request, this is just HTTP from a non-PROXY client; move on
++
+             @read_proxy = false
+-            return @buffer.size > 0
+-          else
+-            return false
++            return true
++          end
++
++          if @buffer.start_with?("PROXY ") && crlf_index + 2 > PROXY_PROTOCOL_V1_MAX_LENGTH
++            raise ConnectionError, "PROXY protocol v1 line is too long"
++          end
++
++          if md = PROXY_PROTOCOL_V1_REGEX.match(@buffer)
++            if md[1]
++              @peerip = md[1].split(" ")[0]
++            end
++            @buffer = md.post_match
+           end
++          # if the buffer has a \r\n but doesn't have a PROXY protocol
++          # request, this is just HTTP from a non-PROXY client; move on
++          @read_proxy = false
++          return @buffer.size > 0
+         end
+       end
+       true
+--- a/lib/puma/const.rb
++++ b/lib/puma/const.rb
+@@ -255,6 +255,7 @@ module Puma
+     # Banned keys of response header
+     BANNED_HEADER_KEY = /\A(rack\.|status\z)/.freeze
+ 
+-    PROXY_PROTOCOL_V1_REGEX = /^PROXY (?:TCP4|TCP6|UNKNOWN) ([^\r]+)\r\n/.freeze
++    PROXY_PROTOCOL_V1_REGEX = /\APROXY (?:TCP4|TCP6|UNKNOWN) ([^\r]+)\r\n/.freeze
++    PROXY_PROTOCOL_V1_MAX_LENGTH = 107
+   end
+ end
+--- a/test/test_puma_server.rb
++++ b/test/test_puma_server.rb
+@@ -1065,6 +1065,75 @@ EOF
+     assert_equal 'fd00::1', remote_addr
+   end
+ 
++  def test_proxy_protocol_rejects_line_without_crlf_at_max_length
++    server_run(remote_address: :proxy_protocol, remote_address_proxy_protocol: :v1) do
++      [200, {}, ["Hello"]]
++    end
++
++    socket = new_connection
++    socket << "PROXY #{'A' * (Puma::Const::PROXY_PROTOCOL_V1_MAX_LENGTH - "PROXY ".bytesize)}"
++
++    assert_equal "", socket.read
++  end
++
++  def test_proxy_protocol_allows_non_proxy_requests_over_max_length
++    server_run(remote_address: :proxy_protocol, remote_address_proxy_protocol: :v1) do
++      [200, {}, ["Hello"]]
++    end
++
++    response = send_http_and_read( "GET /#{'a' * Puma::Const::PROXY_PROTOCOL_V1_MAX_LENGTH} HTTP/1.0\r\n\r\n")
++
++    assert_match %r{\AHTTP/1\.[01] 200 OK}, response
++    assert_match %r{Hello\z}, response
++  end
++
++  def test_proxy_protocol_ignores_embedded_proxy_line_in_http_body
++    server_run(remote_address: :proxy_protocol, remote_address_proxy_protocol: :v1) do |env|
++      body = env['rack.input'].read
++      [200, {'Content-Length' => body.bytesize.to_s}, [body]]
++    end
++
++    body = "prefix\nPROXY TCP4 1.1.1.1 2.2.2.2 3 4\r\nsuffix"
++    response = send_http_and_read ("POST / HTTP/1.1\r\nHost: test.com\r\nContent-Length: #{body.bytesize}\r\n\r\n#{body}")
++
++    assert_match %r{\AHTTP/1\.[01] 200 OK}, response
++    assert_match %r{#{Regexp.escape(body)}\z}, response
++  end
++
++  def test_proxy_protocol_only_parses_first_request_on_connection
++    server_run(remote_address: :proxy_protocol, remote_address_proxy_protocol: :v1) do |env|
++      [200, {}, [env["REMOTE_ADDR"]]]
++    end
++
++    socket = send_proxy_v1_http("GET /one HTTP/1.1\r\nHost: test.com\r\n\r\n", "1.2.3.4")
++
++    assert_equal ["HTTP/1.1 200 OK", "Content-Length: 7"], header(socket)
++    assert_equal "1.2.3.4", socket.read(7)
++
++    sleep 1
++
++    socket << "PROXY TCP4 127.0.0.1 127.0.0.1 10000 80\r\nGET /two HTTP/1.1\r\nHost: test.com\r\nConnection: close\r\n\r\n"
++
++    assert_match %r{\AHTTP/1\.[01] 400 Bad Request}, socket.read
++  end
++
++  def test_proxy_protocol_allows_proxy_http_method_on_keep_alive
++    server_run(remote_address: :proxy_protocol, remote_address_proxy_protocol: :v1, supported_http_methods: :any) do |env|
++      [200, {}, [env["REMOTE_ADDR"]]]
++    end
++
++    socket = send_proxy_v1_http("GET /one HTTP/1.1\r\nHost: test.com\r\n\r\n", "1.2.3.4")
++
++    assert_equal ["HTTP/1.1 200 OK", "Content-Length: 7"], header(socket)
++    assert_equal "1.2.3.4", socket.read(7)
++
++    socket << "PROXY /two HTTP/1.1\r\nHost: test.com\r\nConnection: close\r\n\r\n"
++
++    response = socket.read
++    assert_match %r{\AHTTP/1\.1 200 OK\r\n}, response
++    assert_equal "1.2.3.4", response.split("\r\n").last
++  end
++
+   # To comply with the Rack spec, we have to split header field values
+   # containing newlines into multiple headers.
+   def assert_does_not_allow_http_injection(app, opts = {})
diff --git a/patches/new-certs-generated.patch b/patches/new-certs-generated.patch
new file mode 100644 (file)
index 0000000..78c2793
--- /dev/null
@@ -0,0 +1,649 @@
+Description: ssl certs for testcases
+Author: Abhijith PA <abhijith@debian.org>
+Forwarded: not-needed
+Last-Update: 2026-10-07
+
+--- puma-5.6.5.orig/examples/puma/cert_puma.pem
++++ puma-5.6.5/examples/puma/cert_puma.pem
+@@ -1,21 +1,21 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDgjCCAmqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEO
+-MAwGA1UECgwFbG9jYWwxDTALBgNVBAsMBGFlcm8xCzAJBgNVBAMMAkNBMB4XDTIw
+-MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowSDELMAkGA1UEBhMCVVMxDjAMBgNV
++MAwGA1UECgwFbG9jYWwxDTALBgNVBAsMBGFlcm8xCzAJBgNVBAMMAkNBMB4XDTI2
++MTAwMTAwMDAwMFoXDTMwMTAwMTAwMDAwMFowSDELMAkGA1UEBhMCVVMxDjAMBgNV
+ BAoMBWxvY2FsMQ0wCwYDVQQLDARhZXJvMQswCQYDVQQLDAJDQTENMAsGA1UEAwwE
+-cHVtYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9pa0gvlNdwge/u
+-aZNE5hTyBLH3eQzdduGcYjoSy6AVgab8M8s5O7RPMEDORV6xRuGfNgRI40Kkx4E8
+-w5icHSp9WumsEi5FrKIcIXttquLdcBkUEq9N/mPVZAlg5Jr5IePzWafM0gTdKlR1
+-LN/UHcVaMHWt4/Kz2ja9wlUhaKly7+UG1JdHhQ1yrAVVUTLN9YT8VTkyaB11+K0m
+-KpdvHcyFuB4yBcvCd4iGSIqf7wjlEIRp8Pa9C6tR8gAlCi4APlzmngYod3wbXAhE
+-psjvSXCWCdeHKD/wAgBz1abA4yNnSIhb4KFFkGMn+F74ZjeCZN287lz/18gQLn06
+-3EXVKIECAwEAAaOBhTCBgjAMBgNVHRMBAf8EAjAAMDEGCWCGSAGG+EIBDQQkFiJS
++cHVtYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYqWLZujJSPkcEp
++yPQ6l07HFV0BZ8Hq0+HaRtfpgQY6Yzvms8w2a/Z1ZQ4SMNBrhEGoDxxWsu765flF
++/f98IzzedDk/gXW5IB9lhp3pdANiVkwSP+gYT53g+CN7WJw3xx6UrcTP/hz/Qe+w
++OspH4mMdv4wF8yxNFf4ktuyr5Oug/MfxeW5v14b3uOPNhr0fHuAFDSldGzDuydUM
++bbPH25HcDqz0xLz1Pek7zsBSm3sUxwOxnToWAAMJo5vyhyNO0SpQlLxGap1Qq1il
++FsaxV29WtnYNVpsVF688061QDQp62yX4J1qPshd6arqZh1hFiy9H56YDPXqNQ0Ph
++HmYqJHMCAwEAAaOBhTCBgjAMBgNVHRMBAf8EAjAAMDEGCWCGSAGG+EIBDQQkFiJS
+ dWJ5L09wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTyDyJl
+ mYBDwfWdRj6lWGvoY43k9DALBgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
+-AwEwDQYJKoZIhvcNAQELBQADggEBAH2YCJJY9RFO8a7wW+9LonTVL1QLvpS0bgqC
+-1CvW3ANCXriCXHUHc/aLmneRfXhrezCcAgqyqG2+HxJ3fLllec7lbiznnV7DaAmn
+-Jhgmlho9fw2FxPA4iZ5DQvCALS0Ho4Vo+kPVExbhH4XKZkVTJosms5TWmDaeyfN0
+-PyWDeyKsjqi9oXqqAZKBo9DFWxkJUThzpxXdWo2S9cKt7EWJJlgdlmQGyoo39Xdu
+-86MxNGfaS+7ChzcXQVu1B/t0fpFKfkVCEKvNEQ50v/D01Ed0hgQPOaqgFvFMp0eU
+-B0b1xpKQ2OshyOK1048ou3Gv+fAw+xtcC840T0DDMte73sysXtg=
++AwEwDQYJKoZIhvcNAQELBQADggEBAIYADOhm+LsB2/715nRkmz7O8RdZryqIr3Kd
++2BumUXpHvs97hy6a+2GEmyYVN5DNxogX+O0nl0VjZVQrEoPFI+RFdEJp6N9aH6Og
++MvUuAv5Aob4ct0kkwLRMmPYNon4lG1gt15mo/hpb9aDaeIwRE/v3ttXzhIQ+/sFa
++ZwoRT4TfcTqGC9TN3RsWmQtuPPoxw7jhNbLCNyqSaHJd1gKHoN7Ftu1vL78k9xb6
++cF4d0QveFElymKdjbkm1nPtrgFkoPtNnMt1Kwdu+dZbDLl2q7zEfikvCfe93fKLX
++RX3QlklKPC350yBRn82UiKTe0ZS57CQiBNcFz/DVF79oSN+1mlE=
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/ca.crt
++++ puma-5.6.5/examples/puma/client-certs/ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjYx
++MDAxMDAwMDAwWhcNMzAxMDAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
+-DQEBAQUAA4IBDwAwggEKAoIBAQDIHxrFcS2JkRQbXLFosb32unVkVuwHSPSt6Dpl
+-2jUQHP/bceAx/d9waHYf8rlbCFAIoduZDOc7XCJUidgcG5NfLJyQpkkWOU8CGWH+
+-Ipl4AE8auYCcy/0T7BQqaRC41HPmrJG1CC40rqcY47lUO2haI+vj5TZFHNhAbRat
+-rR1iD1veis2gBZtrMzd4IlpvEHGv6ghfnSc20za4exmapjp/uAAIOXpeFX8QHumA
+-bty4dd+iHpKjDzUrhG9Qa5v28ii2K1AcbczUQ7FzSp2/GoRSjF+WY6i86N9Z1M97
+-2PEgy0IG5l6JHu1P0/rd00hN0h0Owzv3V5ldMLZap7+pVFQTAgMBAAGjIzAhMA8G
++DQEBAQUAA4IBDwAwggEKAoIBAQC1P8p5V+jPPJOVDlCQmaGkVe9i3uJpuZxBdvyT
++71O/8uMuosJN1lq1s5dL2/eh+9rjjMHQrO/RuB3VCkWRNsbNq8bHDOPIIXiVOAPK
++2tLI+58OFX904+uf+3ySGLMwQDPR52ov/ArCx28a/L5hg4tf/boXBdeOtfZvuCp0
++GvdI0LYNeR26M28FsUFmH7PsbLRnNbq6hynayrMCipYQkavM2FuKPDtIg5OYFlHG
++4bamXTRG+VmH6qdTY825al8+04Uuom9kx6Fg1Ee/+mD5lqXlKo/BxO6UhRiZwrTf
++l/EBicxdc2aLyY5zVAtDY6VVDOTHj3oZkjwWgV0ytcpi8f63AgMBAAGjIzAhMA8G
+ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
+-AQA3GWpy4bYLOHLENDTUBeclF6cDdYiautD6gxd1SDLMWOhAUF7ywwT87OAJdr1I
+-+W1TUv5BRG21rNm1QsZfLbStdKA1mpiET/9nYN7m1YauL5hI3yD49TGuO9/sxcE5
+-zNW7D3VBVNq+pyT21/TvLAgxCNvjjm7byzyIOcoRUyZx8WhCf8nUT6cEShXqEg4Q
+-iUBSLI38tiQoZneuVzDRlXBY0PqoB19l2Kg9yThHjPTVhw5EAQSDKXCCvaxAbVw6
+-ZPLNnOdK6DvqEZ3GC5WlaHQdmLxmN4OfV6AEtpgqgGY9u8K1ylTr3ET7xLK7bhcA
+-oZsggEVZr1Ifx9BWIazRNwlw
++AQB3E+f+miY+Fu4IOoXe9b2/mP+S0IzvGTXEtKnOG3n24B1SLGMSr1HcyUySI8n/
++qwwONSUfL8kGWintY8gTAlHhVjdW8gTLXVGMV9aYexxcojycta4MqM60uRMunBD3
++CGjP45pd76sJsJ0paZMrdqjjMYYPHxI8sau3VQbKZ96DeTWvrEOGm6xQtQ5qbFQy
++ZjEFZmy72N/Occ421IprCGOkuuV24q9sgWssOHF6/nbRdsJMXlxGtCXSq8YM5SEn
++3YReyODq2foayZOmOR1VTR4JMJnlB9b36WbjkTz8jQGcHqKqzwXUEFgdywOxZaZ3
++saaKCW4MbsGrqXEAck5iK35K
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/ca.key
++++ puma-5.6.5/examples/puma/client-certs/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+--- puma-5.6.5.orig/examples/puma/client-certs/client.crt
++++ puma-5.6.5/examples/puma/client-certs/client.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjYx
++MDAxMDAwMDAwWhcNMzAxMDAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
+-IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
+-ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
+-E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
+-FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
+-u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAApaKvnGiRqs
+-Vz4B06f/mDLmN7gb0e/evEypB2S06fp9f/oWWHXHCxpx9bKbiHFNNiinoc97/Spb
+-GzylHV/n9j8GEtZmJMiSJZubN8vpn1Jg0Usz3ZtAy0fe9ephjBIXPpwrsGF6Oz3u
+-U/b2zTpJX3oJ3Eq6Q9hLplYU3bNHfrw6PAbzbB91zVTFsqZUTctKrMRgp68FA4fw
+-VWQkb4QwLK1UVJIT/nR3v7nJDktgpR4mfdrtWbWxOGm/ed2oOilpqVhVN99P+bUn
+-3cFkQ6PSYK8En9jJhBMe/zQqpSyy09Tfi/Zy6nzZv0ah53bpeCFLZFi+0CU8HwPr
+-MuD1XQN72zg=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlfZAk/6RuOY5RI4uzGfTNTr4AVpO
++2Xqw1HVOZcojQmUqUBKxIkmk75Rlbh4HO7ORnfXDUYTogVEcgbOtPDN3PNkBgA/J
++lelbJl7gklNDYs3aK70KFKe5YVgONPUuzg9jwpwK/K+iCOCh2ynXq/QAzJk7K7ad
++fdAQGtiHnGKWO085jmOPIuPmjcf393VUKnhC2B+dsThalii2OjKI95vhxVohqyPk
++MGk7EquEwQE1yKG0+WUw6qJ8KigQeiN0rKX8F4Zw582e1j2K7zQqWOJu1YD0UVch
++Q8YQRxH29r2hwkZph7xY4L+pH7knLDJkrIamDzkBM1YIRVLZw9HVoNcAWwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHMqrcsyYja9
++kzBjXMp6bIEWpHGQOBoFUZMV9xGtsCWOXt179s5suPi3cnayIlIy0/kGECtd7Vbi
++YZGlNhnmAg1nr3nEa3mvXWgIdOwjhKiIxZGUgZ4QG9kniXoRQR5y5t5tINipuf0c
++thg2JpTDrtckgdMvaT/rs/9W0SQP7EhW6JXxTUHNtTQRnx8Yhb8iNdil42cZUUzf
++O7UUzHnxIr9cH5NnNVzz5SEXYdQSIAvhVppg3C7NSOMfe4djqd79oojjymXpws37
++qKfbSQey8GJR7IrcAbt5Dpw7RsvPsYr0gTILyakyoqO0sNzP2GWT2ysivM0QQQov
++2TwZyRM05pc=
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/client.key
++++ puma-5.6.5/examples/puma/client-certs/client.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+--- puma-5.6.5.orig/examples/puma/client-certs/client_expired.crt
++++ puma-5.6.5/examples/puma/client-certs/client_expired.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMTkw
+-ODAxMDAwMDAwWhcNMjAwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUx
++MDAxMDAwMDAwWhcNMjYxMDAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
+-IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
+-ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
+-E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
+-FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
+-u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHDfDovSTCmM
+-sxDCfTGQUYwnvOohTP0hjUHB6BzNAPVKYoBiq064m/JoDFmOGGtF3CqhWqtE2psl
+-eOK8fA/QomyFaIAowhx8qrswMP7T/rRldAG+9QHBYZGkPtbB8evK6XqrMEQTf2Ux
+-FlN3p7BZl9rhtuManMb+Wud3HfLYjXn2nTRvkOTi93MP05Vrho8KegZ9Kj4wY1rK
+-gOnkbI6bv+1r9yjsZuUKPH/OjFkpmAoOab5hX5R5CmEefGAet2KPCNrApuwfvRHT
+-x9jVwtOYBHq3DVcBDBu+O38L+WlKGeXvUK4AzvxQaVUysCG3DA1zrvyI3Y8Jy2Jk
+-KfmWZWlvXlM=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlfZAk/6RuOY5RI4uzGfTNTr4AVpO
++2Xqw1HVOZcojQmUqUBKxIkmk75Rlbh4HO7ORnfXDUYTogVEcgbOtPDN3PNkBgA/J
++lelbJl7gklNDYs3aK70KFKe5YVgONPUuzg9jwpwK/K+iCOCh2ynXq/QAzJk7K7ad
++fdAQGtiHnGKWO085jmOPIuPmjcf393VUKnhC2B+dsThalii2OjKI95vhxVohqyPk
++MGk7EquEwQE1yKG0+WUw6qJ8KigQeiN0rKX8F4Zw582e1j2K7zQqWOJu1YD0UVch
++Q8YQRxH29r2hwkZph7xY4L+pH7knLDJkrIamDzkBM1YIRVLZw9HVoNcAWwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAELNjE/D13Ya
++8DznEAMiGA7+66nK6F4GVlj8BOagpty8rb0TqNP0l5MGH+r5WtoSs+UMuoezb3VP
++A+LZg8fr0EJClvK4GFRpp6sRQxJmeXYSN+2VTUJFwkvhxeOEGFGFHkCn78ByBpxK
++XDwvytxkyZUzzis2EMvk93h5s2pD36xaITJ+O5tn3d7bsls9877Q93bRLRdfniow
++d3VnQmOT4nSPAZ/dne3IS4Pi+YD/QtYQyLh2tERwXtoBkzzolWKSAmUDmR13ltAp
++bHrbh02GJjZgjf5BWSQuBIST+b1tGoMCGXY6fFxHPVL2HSo8obzA4R0uLTup4mXx
++i5z+vwqMdQw=
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/client_expired.key
++++ puma-5.6.5/examples/puma/client-certs/client_expired.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+--- puma-5.6.5.orig/examples/puma/client-certs/client_unknown.crt
++++ puma-5.6.5/examples/puma/client-certs/client_unknown.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTIw
+-MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI2
++MTAwMTAwMDAwMFoXDTMwMTAwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
+ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIw
+-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQo9ve3XI5fiKE5AKI3Qm7aeGwy
+-uIR5RBo58Na4saBSfCaKZvNwzuEimKN6S4ShUlV0egKwCs/KvzbhQJpIxVsLQCGs
+-AQDxdOGP1FyizQvzDhzL7BC2I/Dp3A5V6uXkxo1qTqoBdTYeJ/mdIVgZ7bgTnUdu
+-uY9KErU/ugR8MbqZyQel/04PSmkCTdhzP41w0xvmc7Jgab0vJ0oXU4knXIyKsLeq
+-BkL6fevPW4fdaU+ppXBvpsgWfACk/WZs+DyhPndcX7JNrcnYIIAJy75wivqw2RDB
+-m59XNhoDwbR21EkcZnlQL59pv4ASA7DrJs+tFoGqsCs7DyEioePNp6ZraSkCAwEA
+-AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBMbPmIekCi
+-TMLtclXtkhKUefb9hoALhABwRbTbzPjz+MGJX2BMwLt8bAs6AMY8jEazvfm9+G0m
+-1liBAGWFojSzAykNIq/zAG2tgDVolQp3x4JcyFDJ0cuR8DIdll2CCnLM2jP8Nek8
+-wSyuWDsm1U5kmos/dP/ialCvvCLHULoSCBhsyBFKmH2ViXdW09Wg4jSQ4RIToBBn
+-w/VbObeKA8NBUW6/7w6MS1oeFL3PlZJ205zVrZ68nqm/ckYyaBAdlQNTmlThNSQ5
+-eL7w2QgfYDM72Sk4/rjZsW0kH+V0ZqmIuyVBE6jo5EulGPLo2eQEfPmhEdbo5rFi
+-foV+QKM8z3K0
++DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkNySbzjqbbzIf0mDuksPz2vMnU
++kTVupWI9Wl+jY3ndOOaBMYW9nRTU793WaT2cojGbHoM1Vsou+2rgh82ImEB8/iTs
++Cc+ZhMDN14AdAMyhgTqDTWcMXtuNT3lICdsN30TJcZDnFgwgQcHGehHNYuFrh0Sg
++6j5OAA6DC9JRU34qNUGwOl/n6PvWjLqKOxoKOJSlppzY16Wk46gqyGEttIZ+7N5j
++SClwMcH8nelu92AvABcV910xiy3DIZNIn47r5J3fFDmeaEAttLWP6d77GY85gnkN
++pXf/cgKZLbsCh4LB1GfhjtNFR0ShivXwabB3khQAhhSv8QzARZd5MVkdnH8CAwEA
++AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBCXujxzfsv
++PuVwIAIUyXcI1CBs7zJC1JfteyKpy81FZ4eU3OSO80cMXsgYrXgGhY6tBGt/5Pu5
++29SUiACOjfURFYKkFYyJ2MelOAaq0C2BaQomgO1wTd/79B0XX+0noJOS8qgO/i25
++mqByrafXqWa9eN8qczWXKHa6VcBoXuZo+30be5LrAEZGaWnYUVpEac3JqM9Ts12N
++Svp0KJBxgSBwpYPQvLgVF/I09SkbIoY5dYSNX/FtzXhDLxjt7HC2RslK7Hid6C0f
++lG5h0KYC30JQTjEaObBMHwYMXnw0hKS+aygH7Di2kvhriD8iHG2zi1431boDxeiP
++E0XnJ5+AE8/a
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/client_unknown.key
++++ puma-5.6.5/examples/puma/client-certs/client_unknown.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+--- puma-5.6.5.orig/examples/puma/client-certs/server.crt
++++ puma-5.6.5/examples/puma/client-certs/server.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjYx
++MDAxMDAwMDAwWhcNMzAxMDAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXOg3gTrGJfVft9cSrfGRnEZezDB
+-L93fcLwJAoaXGxbEg1RW/fOrSpSNemuqOvbzczV7m5eYTf1lHPBJsndbYyijIR1+
+-Fp4tjFDp76SC3hxCIc3uYXIz0qQwSOAi1z15zobS4xF29jlsXWtfBl9fivjzdj/f
+-pbZ+JPYOrlcJAf6Xmr3xh//13rOI0ytBMlWf51z/iAZBLm2wvbt+nR7B6koAdTgM
+-Coe+gOtcLWYY5ApJ4qB9knGdxWoF5p7guHHw2aGTM0jyhgBowfVkFRiE2JUmODae
+-g+dHsd8ogWbqhGyZTredJF/NRrLKU0h+t7ldKHvXEZy4qyqQlvKoTpODqQIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAI/bcQP4Hu9O
+-OtaaIjVxN8+9jXUOrMpSogmZ4bRKImispt9SA+sbxec7iOMM2pG3Py2yi0hWGzii
+-hSebWIsM1JuPj7ks9l8nGRxpGeInJwTkJorG4ZLEypoS2wW3fQZGx3o4da5V+U2Z
+-HEY0wQTbPBqqnyeZ16ZFNVCzw8y9l7y7CEFjvUO3sq0pne9r7Z+XVgjGyBdBYkJS
+-0kcqPBXFCMHrWH5UlacYlM5cqgoVztOp2STGmR3XR7a34oueeA10QSP+jzeYvWA1
+-wTYA762uU2ReCdujfNbf8V1tZWAH36KldM3hhDNWeveAGxxj1h2R9T/k2kHl/a7D
+-I3VdS59vjJY=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnihQ8P6kgn066bN+g+i76KYdFo9g
++sHwmxYZrZroK8E496NptIpmFpRe7lwRQNcCVYVfi/tSCh/UgI5gD8isvMl6wj0aR
++4RT+5xGmiql0J8yOqrIQh3pkWIEeH2Yj04IAS3fOLjEPzSKFRmk9ji3fzdOBM67E
++FRX4ETU47zVRaQsLdFd/TkxZ0PNW4RC6U9YFtG157hPQZ+f4absQx83cI5aFCzSP
++nsK5vQUK4hMP2fYyDaIDgiWtmDc+nHzrUfzs5tavxIqj2FDLucM9bln4XrdedOzL
++Uun39J6Ywcz+VQPc02yR6zSFRsW5Q9RgloPMKFSa0kHvGxW0qSR1ckOFgQIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAELzAVm3cFIj
++iQWCrhYdS1SBTeOZv4+bIuj+nmOSLcJbn5sGp3OStXXlYvZvxV7KveX1rfHonSSg
++/fUFk+6jFZNfl0m7aqG2MbQ9xasva3SJI/jFapAqAiXVMXAfEBj36D9KJc5lHHTM
++wxByYLtt3mxleunitpw7RbPbgu1ChNu480TNV3yk9iYzmTNaG24aZpd9wEIcrrNU
++oxdE777aISQwFVa+5edsHkdZV4zQUOlTvitPkR9lO0Kh7jXGlqgFd1nMQ+aOMBdA
++6D3NbkW93mTXIQA2rGEyasbUUZBVzplj1E9cqreLLqD9M7r5dQdEaxwqhjTLY+sG
++0MG7o0Hfu4U=
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/server.key
++++ puma-5.6.5/examples/puma/client-certs/server.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+--- puma-5.6.5.orig/examples/puma/client-certs/unknown_ca.crt
++++ puma-5.6.5/examples/puma/client-certs/unknown_ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDEDCCAfigAwIBAgIBETANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTIw
+-MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI2
++MTAwMTAwMDAwMFoXDTMwMTAwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
+ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExDDAKBgNVBAMMA0NBVTCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAJXBTI7itz3JCkNRpR3Jdas/HK2+WLoy3cck
+-taH0OUHPxSEDteNCRlwR07cEWThl6QMQROHEJLCVPIjCLXmu2uwJ6SjPb7keRXJb
+-mOHWo0ZXyc0xnLIv8anWXFAlMconvtpSoYgyNUFwYQdhWTv3I9HrdqCrez70+DXy
+-q3gsTgvixwUIUm+/kWs6zfIHCtwiAusM2Xjrc9Aa/+5JTa3rsdXUXxyrakoKr2ED
+-0BrhWRmopM+xf7V42dNpwuFnrtqDfmyPKtzZbv5J8w6oq7BGC2+CL7MYo1fnonWP
+-kxRZCYzp/qtkhotHHypnpZuQh2puOwnisGykA8rSX/hltCklx5ECAwEAAaMjMCEw
++hvcNAQEBBQADggEPADCCAQoCggEBALIp4dTrRiijv2sILN7SgCAR3bOdWzCL/Yew
++AplM1qkwPB0KYa+6dXndtxVb5TdV5P83t74evZ7wHfPbdvDKgpIPDsjgbRd8O1i0
++9Itp9iUv6BpErqThtM0SPqcvr5dHlZStjvOzbDWApv5S1usgcnDRxNObYGPQ2MTK
++0OgpflMkPCVvFX05DEP2BPXmJOLfWVHSHPKYfl0lba7tTbTa74xhiULhgS7wCL7X
++UVHY6RlzfLGrA5B9TL6xsWPX+WUYUbuD9mxeCtxyXnNGjXAfzW37swEteJXxtHCP
++8BwJ9afz6wp0vLeniOIpSKNWrAtOhtqZrg0i/wo+z4llX9DzVjkCAwEAAaMjMCEw
+ DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQAD
+-ggEBAFH23fStJpmaYUwqIhuWfId4a75eJvp5zpedU4e9Adl+a87u+iNrppa34fPs
+-Ni1XhrGYbh4gTSRmy39R1JW3O5LUDJ6LlDkZOgduiMyLvVksmD70MPuyaBrPmIWE
+-mauOzk3TtvKI4+wBEzLAdYUhliAtMyRJaUN5Bbe+q3P9tL7Hsh9uKusJ5jyMetI7
+-8lLZqKHvE4MDV3AqS6OLLlTC1WdTKR9fqdHYwyh8+DFMBm7PuZjFP9tjDiQwhfEX
+-zbj9J8ba94BA8jmh3Z8a/S0rzcF33KPn+DWyrnyLWWSWKTLHN9TpVHRlhQ4OEOYZ
+-LVu0+VBx8eIwdLZplDfQ9sGUjCs=
++ggEBAGrpVgbp+YSXCBX7KnNe3fpBFOEPJECvI0XzFTNKeYCm8R6I3Qmketel3TxZ
++1Ff7yjZxvdIl51Xw41yC5aSCWDhxh4YkzvgOdCOexWsHUt2LGDQptSnyKCC28syz
++WP4lCwneVdzEVrorNDEnPQ/sYMhdYp5QD7u/enUnyDvAu5licur/m0sWPlpRasE7
++/bcJr/Pa3mGC4iXZ0gauK8i0M4B/3HVm6gL7TOCJImV4aQ7CyDXqK+FJLO+sjcOI
++GXuJf/YLjIvhZarRccW1bDt5AbKudgzXGTjXDGC40uahaPJZMLm9jundBbGD1mPW
++JGDp4c/0dMVyKK3MMiEn6QQvDT0=
+ -----END CERTIFICATE-----
+--- puma-5.6.5.orig/examples/puma/client-certs/unknown_ca.key
++++ puma-5.6.5/examples/puma/client-certs/unknown_ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEowIBAAKCAQEAlcFMjuK3PckKQ1GlHcl1qz8crb5YujLdxyS1ofQ5Qc/FIQO1
+-40JGXBHTtwRZOGXpAxBE4cQksJU8iMItea7a7AnpKM9vuR5FcluY4dajRlfJzTGc
+-si/xqdZcUCUxyie+2lKhiDI1QXBhB2FZO/cj0et2oKt7PvT4NfKreCxOC+LHBQhS
+-b7+RazrN8gcK3CIC6wzZeOtz0Br/7klNreux1dRfHKtqSgqvYQPQGuFZGaikz7F/
+-tXjZ02nC4Weu2oN+bI8q3Nlu/knzDqirsEYLb4IvsxijV+eidY+TFFkJjOn+q2SG
+-i0cfKmelm5CHam47CeKwbKQDytJf+GW0KSXHkQIDAQABAoIBAAHmslIeDrV6F+dC
+-4hW+uP+zjWmnQPkcLDSbArNLpm5vdNE2etinvrzsfQOVyowsvwiK7FTxaIXVXy9d
+-R7aDwcO9XHhoKcLv33HUN9ymHOyHsMgqGRMqCKdfUUyzLC6k0odzBRn1iTeLda/i
+-TH+2Y34GvzrK8oWaFoyYyBR+e38rHOMBF5gmQSkwHZ+8qOsHuI7ajukLioRXLElq
+-ivrOdeaiNmTfofXiDakZm5/SKJ2pXbzQkeibqLkTXeU/p3ltjVrg0GbgF1l5SjmK
+-OyFUeTRjmA8KAFpPri2WggZ6rW9N58u7iF1+hIxRua42lHQ3UXvza41cLX0IjxkT
+-dL0e5QECgYEAxC7kswPej/Omo8T0hZtWHAB6eyas43VzCyypdrDKyfKJGbVWBC61
+-YsOI7L2K1biKsx7gyidOVlNdp3ycmgyyBuH4vn8UhEzOpLLnEw1HX9KDfKQL9yjG
+-f7GYUiHIOE1ah0X45PMpuk/FI0JvFdQCG3MKe7ypM7h2QV2wSM43n3cCgYEAw2p0
+-Dc8AmkEIOP2ZtB4jadD/XTZpxotd6rqZkGt0YWW4fkzdJGjeDhs+W4pT6tG85fFW
+-Bmxz80YsbG9ktHiUTZAS89ixxUnmecudsp4xlTGsGaIboQLPwST8S7iA2AXq0fgW
+-rZX/OiKM+IVbszBWrVpCNHKGPnfiO6PE3GiU4zcCgYBZXTcGKIQQNJ+6x/POjIS7
+-+qfQQzzL2+tMssp662tkdFtpX4XQH+q2E3XiyTBdzFM55p3k1+TCQ/VMXuIC9jd+
+-FR82vzJ8VXRn56qEri7OAlmsxBlDO8q3zhEhkIvgwbO0HPaUbAOc/8tAFXn+inVv
+-RYcH+Fdm3ObZPbEYaP9DXwKBgF14JqiQMbaWkotH6eP4YnHzsKFyLGf2M2bZ+CfW
+-7eTEVdm7hC8tJcFTkKESag8wYQ0PQVlzOIbNMuRu55lW74CmABq4tFcsgNwS44wT
+-FJ5LEwlzu4lpIdw9h5vkVWR+eBIUeyxuSZUR/6HDj9gGr/7c5DvX55QrnX9vVvMh
+-5s1DAoGBAICs0BjCHmAOcEXIHzt3gTju6oj2sQ/Fob03XsEKcfR6Ci32sBQekdqA
+-rpkNiJKzrHjo79nDDcioXGvDD5Duv0fTxFmYME2lTm6nvKS8QF4b+K8C/UKzhpmt
+-zAvwVTOtLnMpHNcKvadSPKFMWNl8M12oi8ELGGPouuh24zX4eyAe
++MIIEpAIBAAKCAQEAsinh1OtGKKO/awgs3tKAIBHds51bMIv9h7ACmUzWqTA8HQph
++r7p1ed23FVvlN1Xk/ze3vh69nvAd89t28MqCkg8OyOBtF3w7WLT0i2n2JS/oGkSu
++pOG0zRI+py+vl0eVlK2O87NsNYCm/lLW6yBycNHE05tgY9DYxMrQ6Cl+UyQ8JW8V
++fTkMQ/YE9eYk4t9ZUdIc8ph+XSVtru1NtNrvjGGJQuGBLvAIvtdRUdjpGXN8sasD
++kH1MvrGxY9f5ZRhRu4P2bF4K3HJec0aNcB/NbfuzAS14lfG0cI/wHAn1p/PrCnS8
++t6eI4ilIo1asC06G2pmuDSL/Cj7PiWVf0PNWOQIDAQABAoIBABATRdhhiyDHF5In
++eG75dMyP+B5I/C2e7/cCe1WMMJEu9DmVkndZ3lgq2GZhtoad5i3d/+L0YJ0a4sT6
++QBrdVtcpaybWUxmLoMox95+tpaM41ZsrJ8viPp9DPmp028XNVHKID24vOfwA2fB4
++FoK8GH9T+guyyQlwkmJ9P0i3V7nWFDj1/vRpo+lfyEm7FXU0oftU/lp5LjyysXKy
++v9Vt4Ugpjw25XJPjD7TsjTNysBoXTmR+xp5tiWQv7rRL4H+3eCxBDn8xzZVQthIp
++6gJhHpdBlCUB8uiISVG2+cUl0TB8SwRZuSznupZLBsJZP0yUX22lr+PxuhRlCtF5
++kWsGm7UCgYEA583dFZzngw1aH8P4hgGSXpJXzPrfeuJq8AFcq9dFAcUN6AU+iuq1
++ZlAYxEYvVdkzF/h8EsaW1YZPWSuPvllf2rr3jEUxphe0iH9juQm/HODsTyGdMluN
++YxjCfJltnhKNAbEDxwZ3RVdl/+Av9mAVDpf5Ngi3/2DOC1ADTPsmgwUCgYEAxMKq
++sNa22SnOvwr4bL7bhenfhb/UmoAGJjXBRShU+E7GRSft0s9YA+rXnKnTb95sz/e+
++pTv4M6yRR0sZn8tg2GwnNROEM13VRdZGSXYTljlCi22dBxNoxcG6DokiH5JOraoQ
++NeDxxXONlpuaZxmq1MPOlarA/5d4AkA6btl6lKUCgYBvg7HgO+OEQGAi9/wPO6JW
++rMBgdDAexd38KCuU37Lq7wmJnTxBSDiMR+wiQEF1Y1AZMAlAXxkhD8QMedBlGknq
++yBde+8quxKitIduvoOi309zbFKizGSgjjD3EA2ugp/v93FKc5JdsXGdNeWSZeg+n
++PaU+QWODD+cPuiZcWlZkoQKBgQCfORC77eUls0lVG+GQzpoCshFpwKShKjzPquxt
++tIeeMNENoZQ45gVJlj9Izb0GaC4R1V/3gqIF3v3pfYKM5x3FxS+tKc/vaV1vGEjk
++paKQDGInRlquISzF61FO9fYhKlp0+owHrbK4oBvR5rV5/TFa3+FLCFUKAF7jI2ql
++zWP+6QKBgQCtQzcwp3cf+/MPycimNeePSKXXbl3zIASzBxNKW/dooROeqKySyfDn
++DxlhgeDUpWeBWZ5O1w4HFgRukjV8PnGNwDMOYQi2PLw8n3jK3xuSV5GVN2A92tMa
++BUY9ZvrQGh6CdJpJ8nsgi3OBwukPh6nRQ3R4f8BIwLx8/Vnv+JfAdQ==
+ -----END RSA PRIVATE KEY-----
+--- puma-5.6.5.orig/examples/puma/puma_keypair.pem
++++ puma-5.6.5/examples/puma/puma_keypair.pem
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
diff --git a/patches/series b/patches/series
new file mode 100644 (file)
index 0000000..2e02e41
--- /dev/null
@@ -0,0 +1,10 @@
+0004-puma.gemspec-drop-git-usage.patch
+0011-disable-minitest-extensions.patch
+0012-disable-cli-ssl-tests.patch
+0013-fix-test-term-not-accepts-new-connections.patch
+0014-disable-test-failing-on-amd64.patch
+CVE-2023-40175.patch
+CVE-2024-21647.patch
+CVE-2024-45614.patch
+CVE-2026-47736_37.patch
+new-certs-generated.patch
diff --git a/puma.1 b/puma.1
new file mode 100644 (file)
index 0000000..47a94c3
--- /dev/null
+++ b/puma.1
@@ -0,0 +1,165 @@
+.TH PUMA "1" "January 2020" "PUMA 3.12" "User Commands"
+
+.SH NAME
+puma \- fast, concurrent web server for ruby and rack
+
+.SH USAGE
+.BI "puma [options...]" " [rackup file]"
+.PP
+.B puma [\-h | \-\-help | \-V | \-\-version]
+
+.SH OPTIONS
+.PP
+The following options are available:
+.TP
+.BI "\-b, \-\-bind " URI
+URI to bind to (tcp://, unix://, ssl://).
+.TP
+.BI "\-C, \-\-config " PATH
+Load given path as a config file.
+.TP
+.BI "\-\-control " URL
+DEPRECATED alias for \fB\-\-control\-url\fR.
+.TP
+.BI "\-\-control\-token " TOKEN
+The \fITOKEN\fR to use as authentication for the control server.
+.TP
+.BI "\-\-control\-url " URL
+The bind \fIURL\fR to use for the control server and app. Use \fIauto\fR to
+use a temp unix server. This requires to use a \fB\-\-control\-token\fR, which
+needs to be given with every request to the control server (\fItoken=foo\fR).
+.TP
+.B \-d, \-\-daemon
+Demonize the server into the background.
+.TP
+.B \-\-debug
+Show low level debugging information.
+.TP
+.BI "\-\-dir " DIR
+Change to given directory before starting.
+.TP
+.BI "\-e, \-\-environment " ENVIRONMENT
+The environment to run the Rack app on. Default \fIdevelopment\fR.
+.TP
+.BI "\-I, \-\-include " PATH
+Specify \fB$LOAD_PATH\fR directories.
+.TP
+.BI "\-p, \-\-port " PORT
+Define the TCP port to bind to. Use \fB\-b\fR for more advanced options.
+.TP
+.BI "\-\-pidfile " PATH
+Use the given path as PID file.
+.TP
+.B \-\-preload
+Preload the application. This loads all the application code prior to forking.
+Preloading reduces total memory usage of an application and is only available
+in cluster mode.
+.TP
+.B \-\-prune\-bundler
+Prune out the bundler env if possible.
+.TP
+.B \-q, \-\-quiet
+Do not log requests internally. Default: \fItrue\fR.
+.TP
+.B \-v, \-\-log-requests
+Log requests as they occur.
+.TP
+.BI "\-R, \-\-restart\-cmd " CMD
+The \fBpuma\fR command to run during a hot restart. Default: \fIinferred\fR.
+.TP
+.BI "\-S, \-\-state " PATH
+Where to store the state details.
+.TP
+.BI "\-t, \-\-threads " INT
+Min:max threads to use. Puma will automatically scale the number of threads,
+from the minimum until it caps out at the maximum, based on how much traffic
+is present. Default: \fI0:16\fR.
+.TP
+.B \-\-tcp\-mode
+Run the app in raw TCP mode instead of HTTP mode.
+.TP
+.B \-\-early-hints
+Enable early hints support.
+.TP
+.BI "\-w, \-\-workers " COUNT
+Activate cluster mode and define number of worker processes to create. In this
+mode workers are forked from a master process. Each child process still has
+its own thread pool and the \fB\-t\fR setting is per worker.
+.TP
+.BI "\-\-tag " NAME
+Additional text to display in process listing.
+.TP
+.BI "\-\-redirect\-stdout " FILE
+Redirect \fBSTDOUT\fR to a specific file.
+.TP
+.BI "\-\-redirect\-stderr " FILE
+Redirect \fBSTDERR\fR to a specific file.
+.TP
+.B \-\-[no\-]redirect\-append
+Append to redirected files.
+.TP
+.B \-h, \-\-help
+Show help.
+.TP    
+.B \-V, \-\-version
+Print the version information.
+
+.SH EXAMPLES
+.PP
+The following examples show how to bind TCP or sockets:
+.PP
+Bind Puma to a socket with the -b (or --bind) flag:
+.RS
+.B puma -b tcp://127.0.0.1:9292
+.RE
+.PP
+To use a UNIX Socket instead of TCP:
+.RS
+.B puma -b unix:///var/run/puma.sock
+.RE
+.PP
+To change the permissions of the UNIX socket, add a umask parameter:
+.RS
+.B puma -b 'unix:///var/run/puma.sock?umask=0111'
+.RE
+.PP
+In need of a bit of security use SSL sockets:
+.RS
+.B puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'
+.RE
+.PP
+The following example show how to Create a control server and use
+.BR pumactl (1)
+to interact with the control server to restart \fBpuma\fR.
+.RS
+.B puma --control-url tcp://127.0.0.1:9293 --control-token foo
+.br
+.B pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
+.RE
+.PP
+
+.SH "CONFIGURATION FILE"
+.B puma
+will look for a configuration file at \fIconfig/puma.rb\fR. If an environment
+is specified, either via the \fB\-e\fR and \fB\-\-environment\fR flags, or
+through the \fIRACK_ENV\fR or the \fIRAILS_ENV\fR environment variables, it
+looks for configuration at \fIconfig/puma/<environment_name>.rb\fR.
+.PP
+The \fB\-C\fR flag allows one to pass on a custom configuration location. If
+the value specified is a dash (\fI\-\fR) \fBpuma\fR won't look for any
+configuration file:
+.PP
+.RS
+.B puma -C \(dq\-\(dq
+.RE
+
+.SH "SEE ALSO"
+.PP
+There is extensive documentation at <\%https://puma.io/puma/\%> and
+<\%https://github.com/puma/puma\%>.
+
+.SH AUTHOR
+.PP
+This manual page was written by \fBDaniel Leidert\fP
+<\%dleidert@debian\.org\%>, for the Debian GNU/Linux system (but may be used by
+others).
diff --git a/puma.docs b/puma.docs
new file mode 100644 (file)
index 0000000..b43bf86
--- /dev/null
+++ b/puma.docs
@@ -0,0 +1 @@
+README.md
diff --git a/puma.examples b/puma.examples
new file mode 100644 (file)
index 0000000..e39721e
--- /dev/null
@@ -0,0 +1 @@
+examples/*
diff --git a/puma.lintian-overrides b/puma.lintian-overrides
new file mode 100644 (file)
index 0000000..c5391ca
--- /dev/null
@@ -0,0 +1,2 @@
+# this is one of several sub-directories; no need to rename it
+repeated-path-segment puma usr/share/doc/puma/examples/puma/
diff --git a/puma.manpages b/puma.manpages
new file mode 100644 (file)
index 0000000..c9bff2d
--- /dev/null
@@ -0,0 +1,3 @@
+debian/puma.1
+debian/pumactl.1
+
diff --git a/pumactl.1 b/pumactl.1
new file mode 100644 (file)
index 0000000..67e70d6
--- /dev/null
+++ b/pumactl.1
@@ -0,0 +1,99 @@
+.TH PUMA "1" "January 2020" "PUMA 3.12" "User Commands"
+
+.SH NAME
+pumactl \- command line client for puma
+
+.SH USAGE
+.B pumactl [options...] [commands]
+.PP
+.B pumactl [\-h | \-\-help | \-V | \-\-version]
+
+.SH COMMANDS
+.TP
+.B halt
+Halt the server.
+.TP
+.B restart
+Restart the server.
+.TP
+.B phased-restart
+Restart server but phase out old workers while starting new workers one at a
+time.
+.TP
+.B start
+Start the server.
+.TP
+.B stats
+Show stats about the server.
+.TP
+.B status
+Show server status.
+.TP
+.B stop
+Stop server.
+.TP
+.B reload-worker-directory
+Reload the worker directory.
+.TP
+.B gc
+Start garbage collector.
+.TP
+.B gc-stats
+Show information about garbage collector.
+
+.SH OPTIONS
+.PP
+The following options are available:
+.TP
+.BI "\-F, \-\-config\-file " PATH
+Load given path as a config file.
+.TP
+.BI "\-T, \-\-control\-token " TOKEN
+The \fITOKEN\fR to use as authentication for the control server.
+.TP
+.BI "\-C, \-\-control\-url " URL
+The bind \fIURL\fR to use for the control server and app. Use \fIauto\fR to
+use a temp unix server. This requires to use a \fB\-\-control\-token\fR, which
+needs to be given with every request to the control server (\fItoken=foo\fR).
+.TP
+.BI "\-p, \-\-pid " PID
+Define the TCP port to bind to. Use \fB\-b\fR for more advanced options.
+.TP
+.BI "\-P, \-\-pidfile " PATH
+Use the given path as PID file.
+.TP
+.B \-Q, \-\-quiet
+Don't display messages.
+.TP
+.BI "\-S, \-\-state " PATH
+Where the state file is.
+.TP
+.B \-H, \-\-help
+Show help.
+.TP    
+.B \-V, \-\-version
+Print the version information.
+
+.SH EXAMPLES
+Create a control server and use
+.BR pumactl (1)
+to interact with the control server to restart \fBpuma\fR.
+.RS
+.B puma --control-url tcp://127.0.0.1:9293 --control-token foo
+.br
+.B pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
+.RE
+.PP
+
+.SH "SEE ALSO"
+.PP
+.BR puma (1)
+.PP
+There is extensive documentation at <\%https://puma.io/puma/\%> and
+<\%https://github.com/puma/puma\%>.
+
+.SH AUTHOR
+.PP
+This manual page was written by \fBDaniel Leidert\fP
+<\%dleidert@debian\.org\%>, for the Debian GNU/Linux system (but may be used by
+others).
diff --git a/ruby-tests.rake b/ruby-tests.rake
new file mode 100644 (file)
index 0000000..412b8da
--- /dev/null
@@ -0,0 +1,30 @@
+require 'gem2deb/rake/testtask'
+
+Gem2Deb::Rake::TestTask.new do |t|
+  t.libs = ['test']
+  if ENV['AUTOPKGTEST_TEST_PUMA_SERVER_SSL']
+    ENV['OPENSSL_CONF'] = '' # https://github.com/puma/puma/issues/2147
+    t.test_files = FileList['test/test_*_ssl.rb']
+  else
+    t.test_files = FileList['test/**/*_test.rb'] + FileList['test/**/test_*.rb'] - FileList[
+      'test/test_*ssl.rb',
+      'test/test_integration_systemd.rb',
+      'test/test_integration_cluster.rb',
+      'test/test_integration_pumactl.rb',
+      'test/test_worker_gem_independence.rb',
+      'test/test_preserve_bundler_env.rb',
+      'test/test_request_invalid.rb',
+      'test/test_busy_worker.rb',
+    ]
+  end
+  t.verbose = true
+end.tap do |t|
+  exclude = %w[
+    test_application_logs_are_flushed_on_write
+    test_hot_restart_does_not_drop_connections
+    test_logs_all_localhost_bindings
+    test_multiple_requests_waiting_on_less_busy_worker
+    test_term_not_accepts_new_connections
+  ]
+  t.options << ' ' << "-e'/" << exclude.join('|') << "/'"
+end
diff --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..fef8de6
--- /dev/null
+++ b/rules
@@ -0,0 +1,12 @@
+#!/usr/bin/make -f
+
+export GEM2DEB_TEST_RUNNER = --check-dependencies
+export DH_RUBY = --gem-install
+export DH_RUBY_GEM_INSTALL_EXCLUDE = benchmarks/* docs/* win_gem_test/* tools/* bin/puma-wild
+export LANG = C.UTF-8
+
+%:
+       dh $@ --buildsystem=ruby --with ruby
+
+override_dh_installchangelogs:
+       dh_installchangelogs History.md
diff --git a/salsa-ci.yml b/salsa-ci.yml
new file mode 100644 (file)
index 0000000..33c3a64
--- /dev/null
@@ -0,0 +1,4 @@
+---
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
diff --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/source/lintian-overrides b/source/lintian-overrides
new file mode 100644 (file)
index 0000000..362d49e
--- /dev/null
@@ -0,0 +1,2 @@
+# no signed tarballs by upstream
+puma source: debian-watch-does-not-check-gpg-signature 
diff --git a/tests/control b/tests/control
new file mode 100644 (file)
index 0000000..e4c5aad
--- /dev/null
@@ -0,0 +1,4 @@
+Test-Command: export AUTOPKGTEST_TEST_PUMA_SERVER_SSL=1 && gem2deb-test-runner --check-dependencies --autopkgtest
+Depends: @, @builddeps@
+Restrictions: allow-stderr
+Features: test-name=ssl
diff --git a/upstream/metadata b/upstream/metadata
new file mode 100644 (file)
index 0000000..5d1f0b9
--- /dev/null
@@ -0,0 +1,7 @@
+---
+Archive: GitHub
+Bug-Database: https://github.com/puma/puma/issues
+Bug-Submit: https://github.com/puma/puma/issues
+Changelog: https://github.com/puma/puma/tags
+Repository: https://github.com/puma/puma.git
+Repository-Browse: https://github.com/puma/puma
diff --git a/watch b/watch
new file mode 100644 (file)
index 0000000..5ce4047
--- /dev/null
+++ b/watch
@@ -0,0 +1,5 @@
+version=4
+opts="searchmode=plain, \
+  filenamemangle=s/.+\/v@ANY_VERSION@/@PACKAGE@-$1\.tar\.gz/" \
+https://api.github.com/repos/puma/puma/releases \
+https://api.github.com/repos/puma/puma/tarball/v@ANY_VERSION@